<?php

namespace app\console\task\tetr;

use app\common\library\BLiveTools;
use app\console\model\Room;
use app\console\task\Task;
use Exception;

/**
 * 定时任务: 刷新互动玩法列表
 * Class DiscoverGameRoom
 * @package app\console\task\fish
 */
class DiscoverGameRoom extends Task
{
    // 当前任务唯一标识
    private string $taskKey = 'DiscoverGameRoom';

    // 任务执行间隔时长 (单位:秒)
    // 新上线需要频繁地抓取才能快速发现
    protected int $taskExpire = 10;

    /**
     * 任务处理
     * @param array $param
     * @return void
     */
    public function handle(array $param)
    {
        $this->setInterval($this->taskKey, $this->taskExpire, function () {
            try {
                $this->fetchRoom();
            } catch (Exception $e) {
                $this->safeEcho(sprintf("抓取方块房间信息失败: %s", $e->getMessage()));
            }
        });
    }

    /**
     * 从插件页面抓取游戏房间
     * @return false|void
     */
    public function fetchRoom()
    {
        // 发起一次请求获取数据
        $tools = new BLiveTools([]);
        $info = $tools->ApiQueryAppDetail('1659261256750');

        // 获取不到数据
        if (!$info) {
            $this->safeEcho('获取玩法列表失败');
            return false;
        }

        // 获取当前玩法房间列表
        $anchors = $info['is_using_anchors'] ?? [];
        $anchors = array_column($anchors, null, 'room_id');
        $roomIds = array_keys($anchors);

        // 查询数据库中已经存在的房间号
        /** @noinspection PhpDynamicAsStaticMethodCallInspection */
        $listRoom = Room::where('room_id', 'in', $roomIds)->column('room_id');
        $diffRoom = array_diff($roomIds, $listRoom);

        // 这里最多就十多条数据直接更新或插入
        foreach ($anchors as $room) {
            // 如果当前房间号在数据库中不存在则添加
            if (in_array($room['room_id'], $diffRoom)) {
                $roomModel = new Room();
                $roomModel->save([
                    'tetris_status'    => 1,
                    'last_tetris_time' => time(),
                    'room_id'          => $room['room_id'],
                    'uname'            => $room['name'],
                    'title'            => $room['title'],
                    'cover'            => $room['cover'],
                    'face'             => $room['avatar']
                ]);
            }
        }

        // 输出本次查询结果
        count($diffRoom) > 0 && $this->safeEcho(
            sprintf(
                "[TASK] 从插件页面新抓取到 %d 个直播间",
                count($diffRoom),
            )
        );
    }
}
